import numpy as np
import cv2
# 读取视频文件
cap = cv2.VideoCapture('bike.mp4')
# 循环播放视频文件，同时显示原视频及其对应的灰度图
# 检查视频是否成功打开
while cap.isOpened():
    # 逐帧读取视频，ret 为布尔值，表示是否成功读取帧，frame 为当前帧的图像数据
    ret, frame = cap.read()
    if not ret:
        print("没有内容，退出啦 :) ")
        break
    #每一帧照片
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #每一帧照片的傅里叶系数
    fCoefs_2D = np.fft.fft2(gray)
    #得到每一帧照片的原始振幅
    msp = 20 * np.log(np.abs(fCoefs_2D))
    #转化为0--255，并用8位整形表示
    msp_spectrum = cv2.normalize(msp, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    #将每一帧照片的振幅shift
    fCoefs_2D_shift = np.fft.fftshift(fCoefs_2D)
    #每一帧照片shift后的振幅谱
    msp_shifted = 20 * np.log(np.abs(fCoefs_2D_shift))
    # 转化为0--255，并用8位整形表示
    msp_shifted_spectrum = cv2.normalize(msp_shifted, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    cv2.imshow('frame', gray)
    cv2.imshow('mg_spc', msp_spectrum)
    cv2.imshow('mg_spc_shift', msp_shifted_spectrum)
    if cv2.waitKey(1) == ord('q'):
        print("用户退出！")
        break

# 释放视频捕捉资源
cap.release()
# 关闭所有的 GUI 窗口
cv2.destroyAllWindows()